package com.fdb.efp.nls.service.impl;

import com.fdb.basic.framework.core.base.FrameworkService;
import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.DateTool;
import com.fdb.basic.framework.core.util.SFTPUtil;
import com.fdb.basic.framework.core.util.ZipUtil;
import com.fdb.efp.nls.service.facade.AccFileBackUpService;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;

/**
 * 
 * 交互文件服务-同步文件备份
 * 
 * @author ludayong
 * @since 2019年1月10日 上午9:27:37
 * @version 1.0
 */
@Service("accFileBackUpService")
public class AccFileBackUpServiceImpl implements AccFileBackUpService, FrameworkService {

	private static Logger logger = LoggerFactory.getLogger(AccFileBackUpServiceImpl.class);

	@Value("${analysis.accFilePath}")
	private String accFilePath;// 同步文件解析路径

	@Value("${file.remoteDownAccfilePath}")
	private String remoteDownAccfilePath;// 前置文件服务器：下载地址

	@Value("${file.remoteAccfileBakPath}")
	private String remoteAccfileBakPath;// 前置文件服务器：备份地址

	@Value("${analysis.hjFtpHost}")
	private String hjFtpHost;// 前置文件服务器IP地址

	@Value("${analysis.hjUserName}")
	private String hjUserName;// 前置文件服务器用户名

	@Value("${analysis.hjPassword}")
	private String hjPassword;// 前置文件服务器登录密码

	@Value("${analysis.hjFtpPort}")
	private int hjFtpPort;// 前置文件服务器端口号
	
	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 同步文件记录异常信息
	
	/**
	 * 
	 * 交互文件服务-同步文件备份
	 * 
	 * @return boolean
	 * @throws Exception
	 * @author ludayong
	 * @since 2019年1月10日 上午9:27:37
	 * @version 1.0
	 */
	@Override
	public boolean backUpFile() throws Exception {
		boolean result = false;
		File files = new File(accFilePath);// 同步文件解析路径
		// 同步文件解析路径
		if (files.exists()) {
			File[] accFiles = files.listFiles();
			if (accFiles.length > 0) {
				for (File accFile : accFiles) {
					if (accFile.isFile()) {// 同步文件
						boolean removeFileRes = ZipUtil.deleteFile(accFile.getAbsolutePath());
						logger.info("删除文件:" + accFile.getAbsolutePath() + "结果[" + removeFileRes + "]");

						boolean renameReslut = renameFile(remoteDownAccfilePath, accFile.getName(), remoteAccfileBakPath);
						logger.info("前置文件服务器移动文件结果，目标路径：" + remoteAccfileBakPath + accFile.getName() + "，结果[" + renameReslut + "]");
					} else if (accFile.isDirectory()) {// 文件是目录
						// 删除文件
						boolean moveDirRes = ZipUtil.deleteFolder(accFile.getAbsolutePath());
						logger.info("删除目录:" + accFile.getAbsolutePath() + "结果[" + moveDirRes + "]");
					}
				}
				result = true;
			}
		}
		return result;
	}

	/**
	 * 前置文件服务器移动文件
	 * 
	 * @param filePath
	 * @param fileName
	 * @return
	 * @throws Exception
	 * @author ludayong
	 * @since 2019年1月15日 上午9:23:42
	 * @version 1.0
	 */
	private boolean renameFile(String oldPath, String fileName, String newPath) throws Exception {
		SFTPUtil sftpUtil = null;
		boolean renameRes = false;
		try {
			// 连接前置文件服务器
			sftpUtil = new SFTPUtil(hjUserName, hjPassword, hjFtpHost, hjFtpPort);
			// 从前置文件服务器移动目录
			renameRes = sftpUtil.renameFile(oldPath, fileName, newPath, true, true);
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "";
			String errorMsg = "前置文件服务器移动文件出现异常：" + e.getMessage();
			logger.error(errorMsg);
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
		}
		return renameRes;
	}
	
	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年3月8日 上午8:40:46:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月8日 上午8:40:46
	 * @date 2019年3月8日 上午8:40:46
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
